package com.c2b.algorithm.leetcode.base;

/**
 * <a href='https://leetcode.cn/problems/merge-two-2d-arrays-by-summing-values/'>合并两个二维数组 - 求和法(Merge Two 2D Arrays by Summing Values)</a>
 * <p>
 * 给你两个 二维 整数数组 nums1 和 nums2.
 *     <ul>
 *         <li>nums1[i] = [idi, vali] 表示编号为 idi 的数字对应的值等于 vali 。</li>
 *         <li>nums2[i] = [idi, vali] 表示编号为 idi 的数字对应的值等于 vali 。</li>
 *     </ul>
 * </p>
 * <p>每个数组都包含 互不相同 的 id ，并按 id 以 递增 顺序排列。</p>
 * <p>
 *     请你将两个数组合并为一个按 id 以递增顺序排列的数组，并符合下述条件：
 *     <ul>
 *         <li>只有在两个数组中至少出现过一次的 id 才能包含在结果数组内。</li>
 *         <li>每个 id 在结果数组中 只能出现一次 ，并且其对应的值等于两个数组中该 id 所对应的值求和。如果某个数组中不存在该 id ，则认为其对应的值等于 0 。</li>
 *     </ul>
 * </p>
 * <p>返回结果数组。返回的数组需要按 id 以递增顺序排列。</p>
 *
 * <p>
 * <b>示例</b>
 * <pre>
 * 示例 1：
 *      输入：nums1 = [[1,2],[2,3],[4,5]], nums2 = [[1,4],[3,2],[4,1]]
 *      输出：[[1,6],[2,3],[3,2],[4,6]]
 *      解释：结果数组中包含以下元素：
 *          - id = 1 ，对应的值等于 2 + 4 = 6 。
 *          - id = 2 ，对应的值等于 3 。
 *          - id = 3 ，对应的值等于 2 。
 *          - id = 4 ，对应的值等于5 + 1 = 6 。
 *
 * 示例 2：
 *      输入：nums1 = [[2,4],[3,6],[5,5]], nums2 = [[1,3],[4,3]]
 *      输出：[[1,3],[2,4],[3,6],[4,3],[5,5]]
 *      解释：不存在共同 id ，在结果数组中只需要包含每个 id 和其对应的值。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 *  <ul>
 *      <li>1 <= nums1.length, nums2.length <= 200</li>
 *      <li>nums1[i].length == nums2[j].length == 2</li>
 *      <li>1 <= idi, vali <= 1000</li>
 *      <li>数组中的 id 互不相同</li>
 *      <li>数据均按 id 以严格递增顺序排列</li>
 *  </ul>
 * </p>
 *
 * @author c2b
 * @since 2024/1/23 15:18
 */
public class LC2570MergeTwo2DArraysBySummingValues_S {

    static class Solution {
        public int[][] mergeArrays(int[][] nums1, int[][] nums2) {
            int[] sumArr = new int[1001];
            for (int[] nums : nums1) {
                sumArr[nums[0]] += nums[1];
            }
            for (int[] nums : nums2) {
                sumArr[nums[0]] += nums[1];
            }
            int length = 0;
            for (int sum : sumArr) {
                if (sum != 0) {
                    ++length;
                }
            }
            int[][] res = new int[length][2];
            int index = 0;
            for (int i = 1; i < sumArr.length; i++) {
                if (sumArr[i] != 0) {
                    res[index][0] = i;
                    res[index][1] = sumArr[i];
                    ++index;
                }
            }
            return res;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        for (int[] ints : solution.mergeArrays(new int[][]{{1, 2}, {2, 3}, {4, 5}}, new int[][]{{1, 4}, {3, 2}, {4, 1}})) {
            Printer.printArrayInt(ints);
        }
        System.out.println("=====");
        for (int[] ints : solution.mergeArrays(new int[][]{{2, 4}, {3, 6}, {5, 5}}, new int[][]{{1, 3}, {4, 3}})) {
            Printer.printArrayInt(ints);
        }
        System.out.println("=====");
        for (int[] ints : solution.mergeArrays(new int[][]{{148, 597}, {165, 623}, {306, 359}, {349, 566}, {403, 646}, {420, 381}, {566, 543}, {730, 209}, {757, 875}, {788, 208}, {932, 695}}, new int[][]{{74, 669}, {87, 399}, {89, 165}, {99, 749}, {122, 401}, {138, 16}, {144, 714}, {148, 206}, {177, 948}, {211, 653}, {285, 775}, {309, 289}, {349, 396}, {386, 831}, {403, 318}, {405, 119}, {420, 153}, {468, 433}, {504, 101}, {566, 128}, {603, 688}, {618, 628}, {622, 586}, {641, 46}, {653, 922}, {672, 772}, {691, 823}, {693, 900}, {756, 878}, {757, 952}, {770, 795}, {806, 118}, {813, 88}, {919, 501}, {935, 253}, {982, 385}})) {
            Printer.printArrayInt(ints);
        }
    }
}
